iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
自我挑戰組

學習筆記系列 第 15

協程 (coroutine)

  • 分享至 

  • xImage
  •  

記錄學習內容。看網路上大大們的文章和影片,做些紀錄。
把這邊當作寫筆記的地方,內容可能有錯誤。
以下內容大多來自網路上大大們的文章。

教學來源:
What are coroutines (aka Java Fibers in Project Loom)?

協程想成輕量級的執行緒,如果用協程的話,系統會自動把協程分派給隨機的執行緒。然後就去執行那個執行緒。
如圖Fibers協程,會經過java Scheduler分派到某個執行緒 。
OS 的Scheduler 再把執行緒分派到CPU的某個core執行。
https://ithelp.ithome.com.tw/upload/images/20200910/20111994Lfm0cMt40B.png

教學裡有講。協程比較輕量,以KB為單位 。Thread則是1MB。
協程只是把自己放到執行緒的一部分?所以wait io的時候 ,不會讓整個執行緒Waiting
https://ithelp.ithome.com.tw/upload/images/20200910/20111994hRpx0x1uQy.png

接著來看:
Kotlin Coroutines Beginner Example (Android)

作者的程式載下來後,觀察協程的執行緒名稱。
DefaultDispatcher-worker-4 、DefaultDispatcher-worker-1 之類的 。
可以看出協程 會由系統隨機分派給執行緒 。有時候全部都是同個執行緒 。
有時候會是不同執行緒。

接著來看Kotlin的協程:
Kotlin coroutine 基礎筆記
Kotlin coroutine協程 用launch 執行:

CoroutineScope(IO).launch

GlobalScope 則是一個 singleton class,它的生命週期會長於 activity,沒有很確定自己在做什麼,盡量不要透過它生出 coroutine。

從使用的角度來看,標示了 suspend 的 function,意思就是執行到這個 function 的時候,能夠讓出控制流給其他 coroutine。也就是這些 function 都會說:「我 OK,(有需要的話)你先請」,自己走到後面重新排隊

接著來看swift的協程:
belozierov/SwiftCoroutine

這邊有講到Coroutine的好處:

Suspend instead of block. The main advantage of coroutines is the ability to suspend their execution at some point without blocking a thread and resuming later on.

不會整個block

Fast context switching. Switching between coroutines is much faster than switching between threads as it does not require the involvement of operating system.

交換Coroutine 不會牽扯到作業系統,是由使用者程式端在控制 。所以交換Coroutine 比交換thread 快很多 。

Asynchronous code in synchronous manner. The use of coroutines allows an asynchronous, non-blocking function to be structured in a manner similar to an ordinary synchronous function. And even though coroutines can run in multiple threads, your code will still look consistent and therefore easy to understand.

Coroutines 可以把 http request 寫的 很像 照順序 的樣子。
像是這邊作者有寫

        launch {      // coroutine a
            println("4")
            getRemoteServer("a")
            println("5")
        }

getRemoteServer("a") 是 http request 。
但是順序還是會一步一步執行
會是: 4 、getRemoteServer 、5。
而不是4 、5、getRemoteServer

接著在看:
Coroutines in C/C++


上一篇
java 執行緒 Scatter Gather pattern
下一篇
yield 語法
系列文
學習筆記46
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言